package com.utn.disenio.entrega3;

import static org.junit.Assert.*;

import java.math.BigDecimal;
import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.Mockito.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;
import com.utn.disenio.entrega2.*;
import com.lanchita.excepciones.EstadoErroneoException;
import com.oceanic.*;
import com.utn.disenio.entrega2.*;

public class TestOceanicMock {
	
	SistemaAterrizarPuntoCom sistema;
	AerolineaOceanicAdapter adaptadorOceanic;
	AerolineaOceanic oceanicMock;
	UsuarioEstandar usuarioTest;
	Asiento elAsientoOceanic;
	
	@Before
	public void setUp() throws Exception {
		sistema = SistemaAterrizarPuntoCom.getInstance();
		oceanicMock = Mockito.mock(AerolineaOceanic.class);
		adaptadorOceanic = new AerolineaOceanicAdapter();
		sistema.getOceanic().setMock(oceanicMock);
		
		usuarioTest = new UsuarioEstandar("Usuario","Test","44.444.444");
		elAsientoOceanic = new Asiento("BS", "LA", "08/05/2012", "09/05/2012", "21:00", "10:05", 5, "1111111", (float) 100, "E", "V", "D", sistema.getOceanic());
	}


	@Test
	public void leLlegaElMensajeALaAerolineaCuandoBusco() throws Exception{
		sistema.buscarAsientos("BS", "LA", "01/08/2012", null, null, null,0, usuarioTest,null,null);
		Mockito.verify(oceanicMock,Mockito.times(1)).asientosDisponiblesParaOrigen("_BS", "01/08/2012");
	}
	
	@Test
	public void agregarUnaSobrereserva() {
		int size = adaptadorOceanic.getAsientosReservados().size();
		Mockito.doReturn(false).when(oceanicMock).reservar(Mockito.anyString(), Mockito.anyString(),Mockito.anyInt());
		usuarioTest.reservarAsiento(elAsientoOceanic);
		assertEquals(size++, adaptadorOceanic.getAsientosReservados().size());
	}
	
	@Test
	public void deBsaNYconEscalaEnSLA() throws Exception{
		ArrayList<AsientoDTO> asientos = new ArrayList<AsientoDTO>();
		asientos.add(new AsientoDTO("OC100",10,"15/08/2012","17/08/2012","10:35","05:35",new BigDecimal("3150.98"),"Ejecutiva","Pasillo",false,"_BS","SLA"));
		Mockito.when(oceanicMock.asientosDisponiblesParaOrigen("_BS", "15/08/2012")).thenReturn(asientos);
		ArrayList<AsientoDTO> asientos2 = new ArrayList<AsientoDTO>();
		asientos2.add(new AsientoDTO("OC100",10,"17/08/2012","18/08/2012","10:35","05:35",new BigDecimal("3150.98"),"Ejecutiva","Pasillo",false,"SLA","_NY"));
		Mockito.when(oceanicMock.asientosDisponiblesParaOrigen("SLA", "17/08/2012")).thenReturn(asientos2);
		ArrayList<Viaje> viajes = sistema.buscarAsientos("BS", "NY", "15/08/2012", null, null, null, 2, usuarioTest, null, null);
		int i = 1;
		for(Viaje unViaje: viajes)
		{
			System.out.println("Viaje: "+ i);
			
			   for(Asiento unAsiento: unViaje.asientos)
			   {
				   System.out.println(unAsiento.getOrigen()+" a "+unAsiento.getDestino());
			   }
			   
			i++;
		}
		
		assertTrue(viajes.size()>0);

	}
		

}
